import functools

from werkzeug.routing import BaseConverter
from flask import session, g, jsonify

from app.utils.response_code import RET


# 定义正则转换器
class ReConverter(BaseConverter):
    """
    自定义路由转换器类，用于在Flask应用中匹配特定的URL模式。

    继承自Werkzeug的BaseConverter类，并在初始化时接受一个正则表达式，用于定义URL参数的匹配规则。
    """

    def __init__(self, url_map, regex):
        """
        初始化ReConverter类实例。

        :param url_map: Flask应用的URL映射对象，用于注册新的路由转换器。
        :param regex: 字符串形式的正则表达式，用于定义URL参数的匹配规则。
        """
        super(ReConverter, self).__init__(url_map)
        self.regex = regex  # 保存传入的正则表达式，用于URL模式匹配


def login_required(view_func):
    """
    装饰器：用于验证用户的登录状态
    功能：如果用户已登录，则执行被装饰的视图函数；否则，返回未登录的错误信息。

    参数：
    view_func - 被装饰的视图函数

    返回：
    wrapper - 内层包装函数

    注释：
    - functools.wraps: 用于将内层函数 `wrapper` 的属性设置为外层函数 `view_func` 的属性
    - session.get("user_id"): 从会话中获取用户的ID，如果用户已登录，则该ID存在
    - g: Flask提供的全局对象，用于在一个请求中的多个函数之间传递数据
    """

    @functools.wraps(view_func)
    def wrapper(*args, **kwargs):
        """
        包装函数：用于在执行视图函数之前，验证用户的登录状态
        """
        # 判断用户的登录状态，从session中获取user_id
        user_id = session.get("user_id")

        # 如果用户已登录，执行视图函数
        if user_id is not None:
            # 将user_id保存到g对象中，以便视图函数可以访问
            g.user_id = user_id
            return view_func(*args, **kwargs)
        else:
            # 如果未登录，返回未登录的信息
            return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    return wrapper